import moment from 'moment';

export const CONSTANT_TAB_KEY1 = 'investOfficial'; // 投资正式版
export const CONSTANT_TAB_KEY2 = 'adjustment'; // 调整版
export const CONSTANT_TAB_KEY3 = 'practical'; // 实际版

export const CONSTANT_EMPTYMSG1 = '版本数据加载中...';
export const CONSTANT_EMPTYMSG2 = '暂无数据';
export const CONSTANT_EMPTYMSG3 = '版本不存在，请先创建新版本';

// 浮点倍数，浮点系数
export const FLOAT_MODULUS_NUM = 1000;
export const FLOAT_MODULUS = 3;

// 所有版本状态 code=>name
export const CONSTANT_VERSIONSTATUS = {
  not_create: '未编制',
  not_prepared: '待编制',
  organization: '编制中',
  examined_approved: '待提交审批',
  approved: '审批中',
  failure_approved: '审批已驳回',
  success_approved: '审批通过',
  sys_generation: '系统生成',
};
// 验证输入框值(三位小数数字)
export const CHANGE_NUM_VALUE = val => {
  // 第一步：没有负号或者 有且只有第一位是负号
  if (!val) return '';
  // 只接受小数点、数字、'-'
  let value = val.replace(/[^\-\d.]/g, '');
  let minus = '';
  const minusIndex = value.lastIndexOf('-');
  if (minusIndex > 0) return false;
  if (minusIndex === 0) {
    minus = '-';
    value = value.substr(1);
  }
  // 第二步 拆分小数点
  const valArr = value.split('.');
  if (valArr.length > 2) return false;
  const initNum = Number(valArr[0]); // 不可多个 0
  let floatNum = valArr[1]; // 可多个 0
  // 整数位最多三位
  if (initNum > 999) return false;
  let num = minus + initNum;
  if (floatNum || floatNum === '') {
    floatNum = floatNum.substr(0, FLOAT_MODULUS);
    num += `.${floatNum}`;
  }
  return num;
};
// isNaN => 0
export const NUM_VALUE = value => {
  if (isNaN(value)) return 0;
  return Number(value);
};
// 相加
export const ADDITION = (first, second) => {
  const num1 = NUM_VALUE(first) * (FLOAT_MODULUS_NUM * 1000);
  const num2 = NUM_VALUE(second) * (FLOAT_MODULUS_NUM * 1000);
  const sum = (num1 + num2) / (FLOAT_MODULUS_NUM * 1000);
  return Number(sum.toFixed(FLOAT_MODULUS));
};
// 0~24 月 字段与名称对应
export const monthName = {
  oneMonth: '第1个月',
  twoMonth: '第2个月',
  threeMonth: '第3个月',
  fourMonth: '第4个月',
  fiveMonth: '第5个月',
  sixMonth: '第6个月',
  sevenMonth: '第7个月',
  eightMonth: '第8个月',
  nineMonth: '第9个月',
  tenMonth: '第10个月',
  elevenMonth: '第11个月',
  twelveMonth: '第12个月',
  thirteenMonth: '第13个月',
  fourteenMonth: '第14个月',
  fifteenMonth: '第15个月',
  sixteenMonth: '第16个月',
  seventeenMonth: '第17个月',
  eighteenMonth: '第18个月',
  nineteenMonth: '第19个月',
  twentyMonth: '第20个月',
  twentyOneMonth: '第21个月',
  twentyTwoMonth: '第22个月',
  twentyThreeMonth: '第23个月',
  twentyFourMonth: '第24个月',
};
// monthName 所有 key 的 arr
export const monthKeys = Object.keys(monthName);
// 12 个业态 key=>value
export const productType = {
  '013': { name: '住宅', outer: '住宅' },
  '044': { name: 'LOFT', outer: '商业' },
  '053': { name: '商业', outer: '商业' },
  '059': { name: '标准办公', outer: '商业' },
  100: { name: '酒店式公寓', outer: '商业' },
  104: { name: '商墅', outer: '商业' },
  108: { name: '独栋办公', outer: '商业' },
  132: { name: '配套', outer: '其他' },
  135: { name: '酒店', outer: '商业' },
  139: { name: '车位', outer: '车位' },
  146: { name: '地下储藏室/非机动车库', outer: '其他' },
  '089': { name: '其他', outer: '其他' },
};
// 12 个业态的 key
export const productTypeKeys = Object.keys(productType);

// 实际版比正式版多出的字段
export const extraNames = {
  dateInitialSigning: '首次签约日期',
  effectiveDate: '生效日期',
  signingRate: '签约回款率',
  suiteSellingRate: '套数去化率',
};
// 实际版比正式版多出的字段 所有 key 的 arr
const extraKeys = Object.keys(extraNames);

// resetData 用
const reset = (arr, key, obj, footerData) => {
  monthKeys.forEach((tar, i) => {
    const num = Number(obj[tar] * 100);
    footerData[key] = ADDITION(footerData[key], num);
    const number = num.toFixed(FLOAT_MODULUS);
    if (!arr[i]) {
      arr[i] = {
        title: tar,
        [key]: number,
        key: `${[key]}_${i}`,
      };
      return;
    }
    arr[i][key] = number;
  });
};
// 转换接口返回的表格数据（response=> {data,columns}）
export const resetData = res => {
  const columns = [
    {
      title: '回款系数',
      dataIndex: 'title',
      key: 'title',
      width: 80,
      fixed: 'left',
      ellipsis: true,
      render: text => <div className="tcenter">{monthName[text] || '合计'}</div>,
    },
  ];
  const data = [];
  const footerData = {};
  res.map((tar, index) => {
    columns.push({
      title: productType[tar.proProductCode]?.name,
      dataIndex: tar.proProductCode,
      key: tar.proProductCode,
      align: 'right',
      editable: true,
    });
    footerData[tar.proProductCode] = 0;
    reset(data, tar.proProductCode, tar, footerData);
  });
  return { columns, data, footerData };
};
// 实际版resetDataPractical 用
const resetPractical = (arr, key, obj) => {
  [...extraKeys, ...monthKeys].forEach((tar, i) => {
    let num = obj[tar];
    if (tar !== 'dateInitialSigning' && tar !== 'effectiveDate') {
      num = obj[tar] == '-' ? '-' : Number(obj[tar] * 100).toFixed(FLOAT_MODULUS);
    }
    // 套数去化率小于 10%或者日期大于当前时间=》 生效时间为 “未生效”    后台判断了小于 10%
    if (tar === 'effectiveDate') {
      // 生效日期
      // 当前时间，后台返回的生效时间
      const now = moment().format('X');
      const effectiveDate = moment(obj[tar]).format('X');
      // 生效时间大于当前时间 = 未生效 || 去化率 < 10% = 未生效
      if (!obj[tar] || obj.suiteSellingRate < 0.1 || effectiveDate > now) {
        num = null;
      }
    }
    if (!arr[i]) {
      arr[i] = {
        title: tar,
        [key]: num,
        key: `${[key]}_${i}`,
      };
      return;
    }
    arr[i][key] = num;
  });
};
// 实际版转换接口返回的表格数据（response=> {data,columns}）
export const resetDataPractical = res => {
  const columns = [
    {
      title: '',
      dataIndex: 'bbb',
      key: 'bbb',
      width: 40,
      fixed: 'left',
      render: (value, record, index) => {
        if (index === 0) {
          return {
            children: '基础信息',
            props: {
              rowSpan: 4,
            },
          };
        }
        if (index < 4) {
          return {
            children: '',
            props: {
              rowSpan: 0,
            },
          };
        }
        if (index === 4) {
          return {
            children: '回款系数',
            props: {
              rowSpan: 24,
            },
          };
        }
        if (index > 4) {
          return {
            children: '',
            props: {
              rowSpan: 0,
            },
          };
        }
        return obj;
      },
    },
    {
      title: '业态',
      dataIndex: 'title',
      key: 'title',
      width: 120,
      fixed: 'left',
      ellipsis: true,
    },
  ];
  const data = [];
  res.map((tar, index) => {
    columns.push({
      title: tar.proProductType,
      dataIndex: tar.proProductCode,
      key: tar.proProductCode,
      align: 'right',
      editable: true,
      render: (text, { title }) => {
        if (title === 'dateInitialSigning' || title === 'effectiveDate') {
          return (
            <div className="tcenter">
              <b>{text ? moment(text).format('YYYY-MM-DD H:mm:ss') : '未生效'}</b>
            </div>
          );
        }
        if (title === 'signingRate' || title === 'suiteSellingRate') {
          return <b>{text}%</b>;
        }
        return `${text}%`;
      },
    });
    resetPractical(data, tar.proProductCode, tar);
  });
  return { columns, data };
};

const CONSTANT_ARRROVE_TAB_NAME = {
  vsInvestMap: '投资正式版', // 审批页面 投资正式版
  vsRealityMap: '项目实际版', // 审批页面 项目实际版
  vsCityMap: '城市实际版', // 审批页面 城市实际版
};

// 审批判断是否数字或者 '-'
const toNum = val => {
  if (isNaN(val)) return '-';
  return (Number(val) * 100).toFixed(FLOAT_MODULUS);
};
const addNum = (first, second) => {
  if (isNaN(first) || isNaN(second)) return '-';
  const sum =
    Number(first) * (FLOAT_MODULUS_NUM * 100) + Number(second) * (FLOAT_MODULUS_NUM * 100);
  return (sum / FLOAT_MODULUS_NUM).toFixed(FLOAT_MODULUS);
};

// 协助整理审批接口数据
const resetApproveTable = (dataSource, columnsName) => {
  const note = [];
  let unitSize = 1;
  const columns = [
    {
      title: '回款系数',
      dataIndex: 'title',
      key: 'title',
      width: 80,
      fixed: true,
      align: 'center',
      render: text => <div className="tcenter">{monthName[text]}</div>,
    },
  ];
  const dataList = [];
  const adjustment = dataSource[CONSTANT_TAB_KEY2]; // 调整列
  const investOfficial = dataSource[CONSTANT_TAB_KEY1]; // 正式列

  // 因为调整和正式数据业态数量相同 所以循环只取其中一个做循环
  Object.keys(adjustment).map(productKey => {
    const { name, outer } = productType[productKey]; // 业态name 和 outer
    const num = note.indexOf(outer); // 查询 note 中是否记录大业态
    // 调整 正式 差异
    const childProduct = {
      title: name, // 小业态
      children: [
        {
          title: '调整后', // 小版本
          align: 'center',
          key: `${productKey}_${CONSTANT_TAB_KEY2}`, // 业态 code
          dataIndex: `${productKey}_${CONSTANT_TAB_KEY2}`, // 业态 code
          render: text => {
            if (text === '-') return <>{text}</>;
            return <div className="tright">{text}%</div>;
          },
        },
        {
          title: CONSTANT_ARRROVE_TAB_NAME[columnsName], // 小版本
          align: 'center',
          key: `${productKey}_${CONSTANT_TAB_KEY1}`, // 业态 code
          dataIndex: `${productKey}_${CONSTANT_TAB_KEY1}`, // 业态 code
          render: text => {
            if (text === '-') return <>{text}</>;
            return <div className="tright">{text}%</div>;
          },
        },
        {
          title: '差异', // 小版本
          align: 'center',
          key: `${productKey}_difference`, // 业态 code
          dataIndex: `${productKey}_difference`, // 业态 code
          render: text => {
            if (text > 0) return <div className="color-green tright">+{text}%</div>;
            if (text < 0) return <div className="color-red tright">{text}%</div>;
            if (text === '-') return <>{text}</>;
            return <div className="tright">{text}%</div>;
          },
          // render: (text,record) => {
          //   const _first = record[`${productKey}_${CONSTANT_TAB_KEY2}`];
          //   const _second = record[`${productKey}_${CONSTANT_TAB_KEY1}`];
          //   const _difference = ADDITION(_first,(-_second)).toFixed(FLOAT_MODULUS);
          //   if(_difference>0)return <span className="colorRed">{_difference}%</span>
          //   if(_difference<0)return <span className="colorGreen">{_difference}%</span>
          //   return <>{_difference}%</>
          // }
        },
      ],
    };
    if (num < 0) {
      // 没有大业态 创建大、小业态
      note.push(outer);
      unitSize += 3; // 设置 table 宽度用的单位个数
      columns.push({
        title: outer, // 大业态
        children: [childProduct],
      });
    } else {
      unitSize += 3; // 设置 table 宽度用的单位个数
      columns[num + 1].children.push(childProduct); // columns 从 1 计   num 从 0 所以+1配套
    }

    monthKeys.forEach((tar, i) => {
      const adjustmentNum = adjustment[productKey][tar]; // 调整板
      const investOfficialNum =
        investOfficial && investOfficial[productKey] ? investOfficial[productKey][tar] : '-'; // 正式版
      if (!dataList[i]) dataList[i] = { title: tar, key: `${columnsName}_${productKey}_${i}` };
      // 调整
      dataList[i][`${productKey}_${CONSTANT_TAB_KEY2}`] = toNum(adjustmentNum);
      // 正式
      dataList[i][`${productKey}_${CONSTANT_TAB_KEY1}`] = toNum(investOfficialNum);
      // 差异
      dataList[i][`${productKey}_difference`] = addNum(adjustmentNum, -investOfficialNum);
    });
  });

  return { columns, dataList, unitSize };
};

// 整理审批接口数据
export const resetApproveData = res => {
  const respones = JSON.parse(res);
  const {
    vsInvestMap, // 审批页面 投资正式版
    vsRealityMap, // 审批页面 项目实际版
    vsCityMap, // 审批页面 城市实际版
    ...data1
  } = respones;
  const { files, ...data2 } = data1;
  const { description, ...basicInfo } = data2;
  const data = [];
  if (vsInvestMap) {
    data.push({
      name: '投资正式版',
      key: '1',
      data: resetApproveTable(vsInvestMap, 'vsInvestMap'),
    });
  } else {
    data.push({
      name: '投资正式版',
      key: '1',
    });
  }
  if (vsRealityMap) {
    data.push({
      name: '项目实际版',
      key: '2',
      data: resetApproveTable(vsRealityMap, 'vsRealityMap'),
    });
  } else {
    data.push({
      name: '项目实际版',
      key: '2',
    });
  }
  if (vsCityMap) {
    data.push({
      name: '城市实际版',
      key: '3',
      data: resetApproveTable(vsCityMap, 'vsCityMap'),
    });
  } else {
    data.push({
      name: '城市实际版',
      key: '3',
    });
  }
  // 列表 data，files，说明，基本信息
  console.log('data=', data);
  return { data, files, description, basicInfo };
};
